/**
* @ Project : p2pt notify
* @ File Name : MailNotify.java
* @ Date : 2014/8/20
* @ Author : harry.zhang
*/
package com.hehenian.biz.service.notify.impl;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Map;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.core.task.TaskExecutor;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
//import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.springframework.ui.freemarker.FreeMarkerConfigurationFactory;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import com.hehenian.biz.common.notify.dataobject.MailNotifyDo;
import com.hehenian.biz.common.notify.dataobject.NotifyDo;
import com.hehenian.biz.common.util.JsonUtil;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* 邮件发送 ,包可见,不让外部直接调用
* @author zhangyunhmf
*
*/
class MailNotifyServiceImpl extends NotifyServiceImpl {
private final Logger logger = Logger.getLogger(this.getClass());
private final static String DEFAULT_TEMPLATE="mail_template_default.ftl";
private JavaMailSenderImpl mailSender;
private TaskExecutor taskExecutor;
private FreeMarkerConfigurationFactory freeMarkerConfigurer;
public void setMailSender(JavaMailSenderImpl mailSender) {
this.mailSender = mailSender;
}
public void setTaskExecutor(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
public void setFreeMarkerConfigurer(
FreeMarkerConfigurationFactory freeMarkerConfigurer) {
this.freeMarkerConfigurer = freeMarkerConfigurer;
}
/**
* 发送邮件
*
*/
public boolean send(final NotifyDo message) {
if(message.isAsync()){
taskExecutor.execute(new Runnable(){
public void run() {
sendMail(message);
}
});
return true;
}else{
//发送
return sendMail(message);
}
}
/**
* 发送邮件
*
*/
public boolean sendMail(NotifyDo message) {
try {
final MimeMessage msg = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(msg, true, "UTF-8");
helper.setFrom(mailSender.getUsername(), "合和年在线");
if(message.getRecievers().contains(";")){
String[] recieverArray = message.getRecievers().split(";");
helper.setTo(recieverArray);
}else if(message.getRecievers().contains(",")){
String[] recieverArray = message.getRecievers().split(",");
helper.setTo(recieverArray);
}else{
helper.setTo(message.getRecievers());
}
helper.setSubject(message.getSubject());
helper.setSentDate(new Date());
if(message.getCcList() != null && !("null".equals(message.getCcList()))&& !("".equals(message.getCcList()))){
if( message.getCcList().contains(";")){
String[] ccArray = message.getCcList().split(";");
helper.setCc(ccArray);
}else if(message.getCcList().contains(",")){
String[] ccArray = message.getCcList().split(",");
helper.setCc(ccArray);
}else{
helper.setCc(message.getCcList());
}
}
String messageTemplate = message.getMessageTemplate();
String htmlText = null;
if(null == messageTemplate || "".equals(messageTemplate)){
messageTemplate=DEFAULT_TEMPLATE;
}
Template tpl = freeMarkerConfigurer.createConfiguration().getTemplate(messageTemplate);
Map messageMap= (Map) JsonUtil.json2Bean(message.getMessage(), Map.class);
htmlText = FreeMarkerTemplateUtils.processTemplateIntoString(tpl, messageMap);
if(null == htmlText){
htmlText= message.getMessage().toString();
}
helper.setText(htmlText, true);
if(message.getFilePath() != null) {
sendContext(msg,message);
}
//发送
mailSender.send(msg);
return true;
} catch (NullPointerException e) {
logger.error(e.getMessage(), e);
} catch (MessagingException e) {
logger.error(e.getMessage(), e);
} catch (UnsupportedEncodingException e) {
logger.error(e.getMessage(), e);
} catch (IOException e) {
logger.error(e.getMessage(), e);
} catch (TemplateException e) {
logger.error(e.getMessage(), e);
}catch(Exception e){
logger.error(e.getMessage(),e);
}
return false;
}
protected void sendContext(MimeMessage msg,NotifyDo message) throws MessagingException {
// 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
Multipart multipart = new MimeMultipart();
// 设置邮件的文本内容
BodyPart contentPart = new MimeBodyPart();
contentPart.setText(message.MESSAGE_CONTEXT);
multipart.addBodyPart(contentPart);
// 添加附件
BodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(message.getFilePath());
// 添加附件的内容
messageBodyPart.setDataHandler(new DataHandler(source));
// 添加附件的标题
// 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
messageBodyPart.setFileName("=?UTF-8?B?" + enc.encode((message.getFileName()+".xls").getBytes()) + "?=");
multipart.addBodyPart(messageBodyPart);
msg.setContent(multipart);
msg.saveChanges();
}
}